﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace B
{
    //    一、什么是桥接模式？
    //桥接模式（Bridge Pattern）是一种结构型设计模式，核心思想是：
    //将抽象与实现解耦，让它们可以独立地变化。
    //通俗理解：
    //它就像“桥梁”一样，连接“抽象部分”与“实现部分”，
    //避免这两者强耦合在一起，使得你可以分别独立地扩展抽象层和实现层。

    //    二、适用场景
    //使用桥接模式的典型场景包括：
    //抽象和实现之间需要独立扩展（如颜色 vs 图形，平台 vs 功能）。
    //一个类有多个变化维度（例如设备类型和操作系统），希望用组合而非继承避免类爆炸。
    //希望通过接口/组合的方式替代深层次继承结构。


    //    三、结构组成（UML）
    //      角色                                            说明
    //Abstraction（抽象类）	            定义高层抽象接口，包含一个Implementor的引用
    //RefinedAbstraction（扩展抽象类）	对 Abstraction 进行细化
    //Implementor（实现接口）	            定义底层实现接口（不一定和抽象接口完全一样）
    //ConcreteImplementor（具体实现）	    实现 Implementor 接口的具体类


    //    五、优缺点
    //✅ 优点
    //解耦抽象与实现：两者可以独立变化。
    //更灵活的扩展性：相比继承方式更好地应对多维度变化。
    //利用组合替代继承：避免类爆炸问题。

    //    七、实际应用场景
    //应用领域                  使用场景
    //图形库             图形类型和颜色、渲染方式分离
    //设备控制           设备（遥控器）与品牌（电视/空调）解耦
    //Revit开发          元素处理方式与图元类型分离（墙、门、窗分别组合操作策略）
    //UI框架             控件外观与行为/平台风格分离
    //数据库访问层        SQL语句与数据库方言解耦（SQLServer vs MySQL）


    //    八、总结一句话
    //桥接模式用于应对两个维度或多维度扩展的问题，通过“组合而非继承”让系统更灵活、解耦。



    //类爆炸问题

    //    四、如何避免类爆炸？
    //可以用设计模式来优雅解决！

    // 模式                        用法                             解决哪个维度
    //桥接模式      抽象与实现分离，用组合代替继承                  实现多个维度变化（颜色 × 图形）,避免使用继承造成类的数量爆炸
    //装饰器模式    给对象动态添加功能，不用创建组合类               功能可组合的变化
    //策略模式      把行为封装成策略，运行时切换                    算法/规则的变化
    //状态模式      状态变化封装成对象,根据状态变化自动改变行为      对象状态组合导致的类爆炸

    /// <summary>
    /// 接口（颜色）
    /// </summary>
    public interface IColor
    {
        string Fill();
    }

    public class Red : IColor
    {
        public string Fill() => "红色";
    }

    public class Blue : IColor
    {
        public string Fill() => "蓝色";
    }



    /// <summary>
    /// 抽象类-形状
    /// </summary>
    public abstract class Shape
    {
        protected IColor color;

        //  修饰符                 可访问范围
        //private                   仅限当前类
        //protected             当前类 + 派生类
        //internal              当前程序集
        //protected internal    派生类 或 同程序集
        //private protected     当前类 + 派生类，但限定在同一个程序集
        //public                无限制，任何地方都能访问

        public Shape(IColor color)
        {
            this.color = color;
        }

        public abstract void Draw();
    }


    public class Circle : Shape
    {
        public Circle(IColor color) : base(color) { }

        public override void Draw()
        {
            Console.WriteLine($"绘制一个 {color.Fill()} 的圆形");
        }
    }

    public class Square : Shape
    {
        public Square(IColor color) : base(color) { }

        public override void Draw()
        {
            Console.WriteLine($"绘制一个 {color.Fill()} 的正方形");
        }
    }


    /// <summary>
    /// 桥接模式
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            func2();

            Console.ReadKey();
        }

        static void func1()
        {
            Abstraction abstraction = new RefinedAbstraction();
            abstraction.Impl = new ConcreteImplementorA();
            abstraction.Operation();
        }

        static void func2()
        {
            Shape redCircle = new Circle(new Red());
            redCircle.Draw();     // 输出：绘制一个 红色 的圆形

            Shape blueSquare = new Square(new Blue());
            blueSquare.Draw();    // 输出：绘制一个 蓝色 的正方形

            blueSquare = new Square(new Red());
            blueSquare.Draw();    // 输出：绘制一个 红色 的正方形
        }


    }
}
